package org.jing.r18.game.comm.bmp;

import org.jing.core.lang.annotation.SerializableField;
import org.jing.core.lang.annotation.SerializableType;
import org.jing.core.lang.data.BaseSerializableDto;
import org.jing.r18.game.venusblood.util.Helper;

/**
 * Description: <br>
 *
 * @author: bksmate <br>
 * @createDate: 2025-05-13 <br>
 */
@SuppressWarnings("unused")
@SerializableType
public class BMPFile extends BaseSerializableDto {
    @SerializableField
    private BMPFileHeader fileHeader;

    @SerializableField
    private BMPInfoHeader infoHeader;

    private byte[] bmpData;

    public BMPFileHeader getFileHeader() {
        return fileHeader;
    }

    public void setFileHeader(BMPFileHeader fileHeader) {
        this.fileHeader = fileHeader;
    }

    public BMPInfoHeader getInfoHeader() {
        return infoHeader;
    }

    public void setInfoHeader(BMPInfoHeader infoHeader) {
        this.infoHeader = infoHeader;
    }

    public byte[] getBmpData() {
        return bmpData;
    }

    public void setBmpData(byte[] bmpData) {
        this.bmpData = bmpData;
    }

    public static BMPFile readBuffer(byte[] allBytes) {
        BMPFile file = new BMPFile();
        BMPFileHeader fileHeader = new BMPFileHeader();
        BMPInfoHeader infoHeader = new BMPInfoHeader();
        // 读取2字节签名
        int offset = 0;
        fileHeader.setSignature(new String(allBytes, 0, 2));
        offset += 2;
        // 读取文件大小（4字节，小端序）
        fileHeader.setFileSize(Helper.byteArrayToInt(allBytes, offset));
        offset += 4;
        // 读取保留字（4字节）
        fileHeader.setReserved(Helper.byteArrayToInt(allBytes, offset));
        offset += 4;
        // 读取数据偏移量（4字节，小端序）
        fileHeader.setDataOffset(Helper.byteArrayToInt(allBytes, offset));
        offset += 4;
        // 读取信息头大小（4字节，小端序）
        infoHeader.setHeaderSize(Helper.byteArrayToInt(allBytes, offset));
        offset += 4;
        // 读取图像宽度（4字节，小端序）
        infoHeader.setWidth(Helper.byteArrayToInt(allBytes, offset));
        offset += 4;
        // 读取图像高度（4字节，小端序）
        infoHeader.setHeight(Helper.byteArrayToInt(allBytes, offset));
        offset += 4;
        // 读取颜色平面数（2字节，小端序）
        infoHeader.setPlanes(Helper.byteArrayToShort(allBytes, offset));
        offset += 2;
        // 读取每像素位数（2字节，小端序）
        infoHeader.setBitCount(Helper.byteArrayToShort(allBytes, offset));
        offset += 2;
        // 读取压缩方式（4字节，小端序）
        infoHeader.setCompression(Helper.byteArrayToInt(allBytes, offset));
        offset += 4;
        // 读取图像数据大小（4字节，小端序）
        infoHeader.setImageSize(Helper.byteArrayToInt(allBytes, offset));
        offset += 4;
        // 读取水平分辨率（4字节，小端序）
        infoHeader.setXPixelsPerM(Helper.byteArrayToInt(allBytes, offset));
        offset += 4;
        // 读取垂直分辨率（4字节，小端序）
        infoHeader.setYPixelsPerM(Helper.byteArrayToInt(allBytes, offset));
        offset += 4;
        // 读取使用的颜色数（4字节，小端序）
        infoHeader.setColorsUsed(Helper.byteArrayToInt(allBytes, offset));
        offset += 4;
        // 读取重要颜色数（4字节，小端序）
        infoHeader.setColorsImportant(Helper.byteArrayToInt(allBytes, offset));
        // 读取整个文件内容
        file.bmpData = new byte[fileHeader.getFileSize()];
        System.arraycopy(allBytes, 0, file.bmpData, 0, fileHeader.getFileSize());

        file.setFileHeader(fileHeader);
        file.setInfoHeader(infoHeader);
        return file;
    }
}
